import { mergeOptions } from '../utils.js'
export function initGlobalAPI(Vue) {
    //console.log(Vue);
    //定义一个静态属性,接收合并后的options,存储全局的配置    
    Vue.options = {};
    //Vue的静态方法,mixin函数,注入/合并多个options
    Vue.mixin = function (mixin) {
        //mergeOptions函数合并后的对象,给vue的options静态属性
        this.options = mergeOptions(this.options, mixin);
        //console.log(this.options);
        //返回Vue这个对象(为了链式编程)
        return this;
    }

    Vue.options._base = Vue;//Vue的构造函数 
    Vue.options.components = {};//用来存放组件的定义
    Vue.component = function (id, definition) {
        //以自身defintion的name为主,自己的name存在使用,没有就使用id
        definition.name = definition.name || id
        //通过对象产生一个构造函数
        //this.options._base===Vue,可能子组件也调用该方法的时候,这里可以永远指向Vue
        definition = this.options._base.extend(definition);
        //存储当前这个定义的组件
        this.options.components[id] = definition;
        //console.log(this.options.components);
    }
    //标记Sub的标识,不同Vue实例,创建同名的组件名不同标识
    let cid = 0;
    //子组件继承父组件,将对象加工成一个构造函数
    Vue.extend = function (options) {
        //this=>谁调用指向谁,this.options._base调用的extend,this.options._base===Vue,this永远指向Vue
        const Super = this;//this指向的是Vue
        //子组件初始化时会new VueComponent(options)
        //定义 VueComponent这个构造函数
        const Sub = function VueComponent(options) {
            //子组件的初始化,调用了Vue原型上的init
            this._init(options);
        }
        //防止不同构造函数创建同名组件名
        Sub.cid = cid++;
        //子类继承父类Vue(原型式继承)
        Sub.prototype = Object.create(Super.prototype);
        //子构造函数的构造指回自身
        Sub.constructor = Sub;
        //子组件继承父组件的component
        Sub.component = Super.component;
        //子类的options由父类的options和传入options合并
        Sub.options = mergeOptions(Super.options, options);
        //该构造函数是由类产生的    
        return Sub;
    }

    //Sub.component(); => Sub.extend();this永远指向Vue

}